package com.stox.client.ui.javafx.widget.dynamic.column;

import java.util.HashMap;
import java.util.Map;

import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.util.Callback;

import com.stox.shared.model.intf.HasScrip;

public abstract class AbstractCellValueFactory<S extends HasScrip, T> implements Callback<TableColumn.CellDataFeatures<S,T>, ObservableValue<T>> {

	private final Map<S, ObjectProperty<T>> valueMap = new HashMap<>();
	
	@Override
	public ObservableValue<T> call(CellDataFeatures<S, T> cellDataFeatures) {
		if(null != cellDataFeatures && null != cellDataFeatures.getValue()){
			ObjectProperty<T> value = cachedValue(cellDataFeatures.getValue());
			if(null == value.get()){
				fetchValue(cellDataFeatures, value);
			}
			return value;
		}
		return null;
	}
	
	protected ObjectProperty<T> cachedValue(S item){
		ObjectProperty<T> value = valueMap.get(item);
		if(null == value){
			value = new SimpleObjectProperty<>(null);
			valueMap.put(item, value);
		}
		return value;
	}
	
	public void clearCache(){
		for(ObjectProperty<T> valueProperty : valueMap.values()){
			valueProperty.set(null);
		}
	}
	
	public abstract void fetchValue(CellDataFeatures<S, T> cellDataFeatures, ObjectProperty<T> valueProperty);
}
